#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Nov  9 20:51:58 2018

@author: tywin

第二章  k近邻算法

"""

from numpy import *


import operator
#创建数据集与标签
def createDataset():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels


#处理文件，解析文件的数据格式，输入为文件名字字符串，输出为训练样本中矩阵和类标签向量
def file2Matrix(filename):
    fr = open(filename)
    print(fr)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)#得到文件行数
    
    #zeros：返回来一个给定形状和类型的用0填充的数组；
    returnMat = zeros((numberOfLines,3))#创建返回的NumPy矩阵
    classLabelVector = []
    index = 0

    #解析文件数据列表
    for line in arrayOLines:
        line = line.strip()#使用strip截取每一行
        listFromLine = line.split('\t')#使用split按照'\t'来分格字符串成数组
        #第index行第0列开始，一直到最后一列，赋值为数组的前三个元素
        returnMat[index,:] = listFromLine[0:3]#取数组的前三个元素存储到特征矩阵中
        classLabelVector.append(int(listFromLine[-1]))#取数组的最后一个元素作为特征标签
        index += 1
    return returnMat,classLabelVector

#归一化特征值
#计算公式  newValue = (oldValue-min)/(max-min)
def autoNorm(dataSet):
    minVals = dataSet.min(0)#取出每列最小值
    maxVals = dataSet.max(0)#趋势每列最大值
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    #获取第一维长度
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals,(m,1))
    normDataSet = normDataSet/tile(ranges,(m,1))
    return normDataSet,ranges,minVals
    


'''
手写识别系统
'''
#将图像格式转换为向量
#循环独处文件的前32行，并将每行的头32个字符值存储在NumPy数组最后返回
def img2vector(filename):
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0:32*i+j] = int(lineStr[j])
            
    return returnVect
